package Day021_反射_注解.demo4_反射之构造方法;

import java.lang.reflect.Constructor;

/**
 * @Author：pengzhilin
 * @Date: 2020/5/14 10:50
 */
public class Test2 {
    public static void main(String[] args) throws Exception{
        /*
            - 获取类的构造方法:
                    Constructor getDeclaredConstructor(Class... parameterTypes) 获取单个构造方法
                     Constructor[] getDeclaredConstructors() 获取所有构造方法

            - 通过反射执行构造方法:使用Constructor对象中的方法,来执行该对象表示的构造方法
                Constructor对象常用方法
                    1. T newInstance(Object... initargs)
                        根据指定的参数创建对象
                        参数: 传入执行该构造方法需要的实际参数

                    2. void setAccessible(boolean b)
                       设置"暴力反射"——是否取消权限检查，true取消权限检查，false表示不取消
         */
        // 获取Student类的Class对象
        Class<?> c = Class.forName("com.itheima.demo4_反射之构造方法.Student");

        // 1.获取public修饰的构造方法对象,并执行该对象表示的构造方法来创建对象
        // 1.1 获取public修饰的构造方法对象  public Student(String name, String sex, int age)
        Constructor<?> cons1 = c.getDeclaredConstructor(String.class, String.class, int.class);

        // 1.2 执行该对象表示的构造方法来创建对象
        Object obj = cons1.newInstance("张三", "女", 18);// 真正返回的是Student对象
        System.out.println(obj);// Student{name='张三', sex='女', age=18}

        System.out.println("==========================================");
        // 2.获取private修饰的构造方法对象,并执行该对象表示的构造方法来创建对象
        // 2.1 获取private修饰的构造方法对象
        Constructor<?> cons2 = c.getDeclaredConstructor(String.class, int.class);

        // 2.2 执行该对象表示的构造方法来创建对象
        // 设置"暴力反射"
        cons2.setAccessible(true);

        Object obj2 = cons2.newInstance("李四", 19);
        System.out.println(obj2);
    }
}
